import platform
import logging
import os

from PyQt5.QtWidgets import QSystemTrayIcon, QMenu, QAction, QApplication, QDialog
from PyQt5.QtGui import QIcon, QCursor
from voice_assistant.event_system import event_system, Events, EventNames
from voice_assistant.ui.config_dialog import show_config_dialog
from voice_assistant.my_config import TRAY_STYLE

def handle_config_dialog(parent=None):
    """处理设置对话框，确保关闭对话框不会导致程序退出，且不重复创建对话框"""
    # 检查是否已有对话框打开
    for widget in QApplication.topLevelWidgets():
        if isinstance(widget, QDialog) and widget.windowTitle() == "语音助手设置" and widget.isVisible():
            # 如果已有对话框打开，则激活它
            widget.raise_()
            widget.activateWindow()
            return None
    
    # 在显示设置对话框前，先保存当前应用的样式表
    app = QApplication.instance()
    old_style = app.styleSheet() if app else ""
    
    # 临时清除应用样式表，确保设置对话框使用默认样式
    if app:
        app.setStyleSheet("")
    
    # 显示设置对话框，但忽略其返回值，这样关闭对话框不会影响主程序
    result = show_config_dialog(parent)
    
    # 恢复原来的样式表
    if app:
        app.setStyleSheet(old_style)
    
    # 确保父窗口保持活动状态
    if parent:
        parent.activateWindow()
    
    # 返回结果但不影响主程序运行
    return result
 
logger = logging.getLogger("tray_icon")

def open_meeting_record():
    # 发布事件，让主线程处理会议记录启动
    event_system.publish(Events.MEETING_RECORD, {
        "command": EventNames.RECORD_CREATED,
        "params": {}
    })
        
def restart_app(app):
    """重启语音助手应用"""
    import os
    import sys
    import subprocess
    
    # 获取当前脚本路径
    script_path = os.path.abspath(sys.argv[0])
    
    # 关闭当前应用
    if hasattr(app, 'shutdown'):
        app.shutdown()
    else:
        app.quit()
    
    # 启动新实例
    subprocess.Popen([sys.executable, script_path])


def create_qt_tray_icon(app):
    """为PyQt5创建系统托盘图标"""
    # 保存当前应用样式
    qt_app = QApplication.instance()
    old_style = qt_app.styleSheet() if qt_app else ""
    
    # 临时清除应用样式，确保托盘图标创建时不受影响
    if qt_app:
        qt_app.setStyleSheet("")
    
    # 创建独立的托盘图标，不依赖于任何窗口
    # 使用绝对路径获取图标
    icon_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 
                            "assets", "icons", "microphone.png")
    tray = QSystemTrayIcon(QIcon(icon_path))
    
    # 创建托盘菜单 - 使用独立的QWidget作为父窗口，避免样式继承
    from PyQt5.QtWidgets import QWidget
    parent_widget = QWidget()
    parent_widget.setWindowTitle("TrayIconParent")
    # 确保父窗口不受其他样式影响
    parent_widget.setStyleSheet(TRAY_STYLE)
    menu = QMenu(parent_widget)
    menu.setStyleSheet(parent_widget.styleSheet())  # 使用相同的样式
    
    # 保存父窗口引用，防止被垃圾回收
    tray.parent_widget = parent_widget
    
    # 添加菜单项
    # 获取会议图标
    meeting_icon_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 
                                    "assets", "icons", "ui", "meeting.svg")
    meeting_action = QAction("会议记录", parent_widget)
    if os.path.exists(meeting_icon_path):
        meeting_action.setIcon(QIcon(meeting_icon_path))
    meeting_action.triggered.connect(open_meeting_record)
    
    # 获取设置图标
    settings_icon_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 
                                     "assets", "icons", "ui", "settings.svg")
    settings_action = QAction("设置", parent_widget)
    if os.path.exists(settings_icon_path):
        settings_action.setIcon(QIcon(settings_icon_path))
    # 修改设置对话框的调用方式，确保关闭设置页面不会导致程序退出
    settings_action.triggered.connect(lambda: handle_config_dialog(parent_widget))
    
    restart_action = QAction("重启", parent_widget)
    restart_action.triggered.connect(lambda: restart_app(app))
    
    quit_action = QAction("退出", parent_widget)
    
    # 检查app对象是否有shutdown方法，如果没有则使用quit方法
    if hasattr(app, 'shutdown'):
        quit_action.triggered.connect(app.shutdown)
    else:
        quit_action.triggered.connect(app.quit)
    
    menu.addAction(meeting_action)
    menu.addAction(settings_action)
    menu.addAction(restart_action)
    menu.addSeparator()
    menu.addAction(quit_action)
    
    # 添加菜单到托盘
    tray.setContextMenu(menu)
    
    # 修复在Windows系统上的右键菜单问题
    if platform.system() == "Windows":
        # 添加左键点击处理，使左键点击也显示菜单
        def on_tray_activated(reason):
            if reason == QSystemTrayIcon.Trigger:  # 左键点击
                menu.exec_(QCursor.pos())
                
        tray.activated.connect(on_tray_activated)
    
    # 托盘提示
    tray.setToolTip("语音助手")
    
    # 恢复原来的应用样式
    if qt_app and old_style:
        qt_app.setStyleSheet(old_style)
    
    return tray